#ifndef GAME_H
#define GAME_H

#include <QWidget>
#include <QKeyEvent>
#include <QMouseEvent>
#include <QTimer>
#include <QElapsedTimer>
#include "player.h"
#include "bullet.h"
#include "asteroid.h"

/**
 * @brief The Game class
 *  Виджет игры. Управляет всей логикой и рисованием.
 */
class Game : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief Game
     *  Конструктор - устанавливает пустое окно с заданным размером
     */
    explicit Game(QWidget *parent = 0);
    ~Game();

private:
    /**
     * @brief start
     *  Начинает игру - запускает таймер, устанавливает начальные позиции объектам.
     */
    void start();

    /**
     * @brief stop
     *  Заканчивает игру - объекты замораживаются, появляется картинка Game Over
     */
    void stop();

private slots:
    void updateGame();
    void makeAsteroid();

protected:
    void mouseMoveEvent(QMouseEvent *);
    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
    void keyPressEvent(QKeyEvent *);
    void keyReleaseEvent(QKeyEvent *);
    void paintEvent(QPaintEvent *);

private:
    static const qint32 m_refreshRate;
    static const qint32 m_width;
    static const qint32 m_height;

    QPixmap m_background;

    bool m_isGameStarted;
    bool m_isGameOver;

    bool m_isMovingUp;
    bool m_isMovingDown;
    bool m_isMovingLeft;
    bool m_isMovingRight;
    qint32 m_mouseX;
    qint32 m_mouseY;
    bool m_isShooting;

    Player *m_player;
    QList<Bullet*> bullets;
    QList<Asteroid*> asteroids;

    qint32 m_asteroidInterval;
    qint32 m_updateIndervalFrequency;
    qint32 m_generatedCount;

    qint32 m_score;

    QTimer *m_mainTimer;
    QTimer *m_asteroidTimer;
    QElapsedTimer *m_timePlayedTimer;

    qint64 m_timePlayed;
};

#endif // GAME_H
